/*
 * @Author: Clark
 * @Email: haixuanwoTxh@gmail.com
 * @Date: 2021-12-10 15:12:32
 * @LastEditors: Clark
 * @LastEditTime: 2021-12-11 17:45:56
 * @Description: file content
 */

#ifndef PROTOCOL_ENGINE_H
#define PROTOCOL_ENGINE_H

#include "id_manager.h"
#include "client_manager.h"
#include "talk_protocol.h"
#include "xml_file.h"

/**
 * @brief 回应码
 */
enum{
    OK = 200,
    FAIL = 404
};

/**
 * @brief 协议引擎，实现协议功能
 */
class ProtocolEngine
{
public:
    ProtocolEngine();

    void establish_connection();

    /**
     * @brief 连接断开时的状态变更
     * @param clientFd  对应连接的socket fd
     */
    void disconnect(int clientFd);

    /**
     * @brief 客户端注册
     * @param clientFd 对应连接的socket fd
     * @param data 注册数据
     * @param dataLen 数据长度
     * @return true 成功
     * @return false 失败
     */
    bool logup(int clientFd, unsigned char *data, int dataLen);

    /**
     * @brief 客户端登录
     * @param clientFd 对应连接的socket fd
     * @param data 登录数据
     * @param dataLen 数据长度
     * @return true 成功
     * @return false 失败
     */
    bool login(int clientFd, unsigned char *data, int dataLen);

    /**
     * @brief 客户端消息
     * @param clientFd 对应连接的socket fd
     * @param data 消息数据
     * @param dataLen 数据长度
     * @return true 成功
     * @return false 失败
     */
    bool deal_message(int clientFd, unsigned char *data, int dataLen);

    /**
     * @brief 发布所有在线的客户信息给每一个客户
     * @return true 成功
     * @return false 失败
     */
    bool public_online_client();

    /**
     * @brief 解析客户端发过来包中的数据
     * @param packetData 包数据
     * @param packetDataLen 数据长度
     * @param clientFd 对应连接的socket fd
     * @return true 成功
     * @return false 失败
     */
    bool parse_packet_data(unsigned char *packetData, int packetDataLen, int clientFd);

    ~ProtocolEngine();

private:
    IdManager *idManager;           // 用户ID和连接socket id管理器
    ClientManager *clientManager;   // 用户信息管理器
    TalkProtocol *talkProtocol;     // 交互协议，组包、拆包等
    XmlFile *xmlFile;               // 保存用户信息的xml文件
};

#endif
